iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0

今日內容:例外處理、寫檔、讀檔、小實作專案(音樂播放器)


例外處理

用於應付會導致程式錯誤的行為,例如除以0、不正確的使用者輸入內容等
使用try{}, catch{}, finally{}
catch可以用來抓 "可能的已知錯誤型態"(建議),也可以抓 "任意的錯誤型態"(避免發生意外)

try{
    System.out.println(1/0);
}
catch(ArithmeticException e){ // (錯誤型態 變數名(隨便宣告))
    System.out.println("You can't divide by zero");
}
try{
    System.out.print("Enter a number: ");
    int num = scanner.nextInt();
    System.out.println(num);
}
catch(InputMismatchException e){
    System.out.println("That wasn't a number");
}

可以對於一個try底下有多個catch(不同的錯誤型態)

try{
    System.out.print("Enter a number: ");
    int num1 = scanner.nextInt();
    System.out.print("Enter another number: ");
    int num2 = scanner.nextInt();
    System.out.println(num1/num2);
}
catch(InputMismatchException e){
    System.out.println("The input wasn't a number");
}
catch(ArithmeticException e){
    System.out.println("You can't divide by zero");
}

而finally{}可以用來回收資源,finally內的程式碼無論是否有錯誤發生都會執行,可以用於關閉scanner或file

try{
    Scanner scanner = new Scanner();
    // scanner do something
}
catch(InputMismatchException e){
    // handle error
}
// catch other errors
finally{
    scanner.close();
}

寫檔

常見的用法有四種(Object)

  1. FileWriter,應用於中小型的text file
  2. BufferedWriter,對於大型的text file有更好的表現
  3. PrintWriter,常用於報錯(reports or logs)
  4. FileOutputStream,輸出binary files,例如圖片或音檔

這邊教第一種(FileWriter)

import java.io.FileWriter;
import java.io.IOException;

// ...

try(FileWriter writer = new FileWriter("test.txt")){// 嘗試在本地資料夾(src)新增一個test.txt
    writer.write("Hello World!");
    System.out.println("File written");
}
catch(IOException e){ // 抓任意有關IO的exception (例如無法建立test.txt)
    System.out.println("Could not write file");
}

也可以使用絕對路徑

("C:\\Users\\HP\\Desktop\\test.txt"); // 記得反斜線要寫兩次,因為 '\' 是跳脫字元

catch(FileNotFoundException e){ // 用來抓找不到路徑的exception
    System.out.println("File location not found");
}

// 也可以用字串來儲存路徑位置或輸出內容
String filePath = "C:\\Users\\HP\\Desktop\\test.txt";
String textContent = "Hello World\nHave a great day";
// 然後對writer中傳入filePath和textContent即可

讀檔

常見的用法有三種(Object)

  1. BufferReader + FileReader 常用於逐行讀取
  2. FileInputStream 用於binary files
  3. RandomAccessFile 用於修改極大檔案中的一小部分

這邊一樣教第一種

import java.io.BufferReader;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;

// ...

String filePath = "C:\\Users\\HP\\Desktop\\test.txt"
try(BufferReader reader = new BufferReader(new FileReader(filePath))){
    String line;
    while((line = reader.readLine()) != null){ // 這裡的null是小寫
        System.out.println(line);
    }
}
catch(FileNotFoundException e){
    System.out.println("Could not locate file");
}
catch(IOException e){
    System.out.println("Something went wrong");
}


音樂播放器

音檔需要用wav格式(java內建可以直接用,用mp3要用外部資料庫)

import javax.sound.sampled.*; // AudioInputStream, AudioSystem, Clip
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;

public class MusicPlayer {
    public static void main(String[] args){
        String filePath = "src\\music.wav";
        File file = new File(filePath);

        try(Scanner scanner = new Scanner(System.in); // 這邊可以用分號分隔,一次try兩件事
            AudioInputStream audioStream = AudioSystem.getAudioInputStream(file)){

            Clip clip = AudioSystem.getClip();
            clip.open(audioStream);

            String response = "";

            while(!response.equals("Q")){
                System.out.println("P = play");
                System.out.println("S = stop");
                System.out.println("R = reset");
                System.out.println("Q = quit");
                System.out.print("Enter your choice: ");
                response = scanner.next().toUpperCase();

                switch(response){
                    case "P" -> clip.start();
                    case "S" -> clip.stop();
                    case "R" -> clip.setMicrosecondPosition(0);
                    case "Q" -> clip.close();
                    default -> System.out.println("Invalid choice");
                }

            }
        }
        catch(FileNotFoundException e){
            System.out.println("Could not locate file");
        }
        catch(UnsupportedAudioFileException e){
            System.out.println("Audio file is not supported");
        }
        catch(LineUnavailableException e){
            System.out.println("Unable to access audio resource");
        }
        catch(IOException e){
            System.out.println("Something went wrong");
        }
        finally{
            System.out.println("Bye!");
        }
    }
}

image


結語

今天是學習Java基本語法的第五天,學到了如何進行檔案讀寫,以及如何使用Audio以及Clip這些庫,對之後做貪食蛇的背景音樂有機會用到。
今天也是快樂學習的一天,明天繼續!/images/emoticon/emoticon69.gif


上一篇
Day 9:Java 問題與概念釐清
下一篇
Day 11:Java 入門資料結構
系列文
30天從基礎學起Java,直到做出我的第一個遊戲21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言